import router from "./router";
import { ElMessage } from "element-plus";
import NProgress from "nprogress";
import "nprogress/nprogress.css";
import { getToken, setToken, getUserId, setUserId } from "@/utils/auth";
import { getloginToken } from "@/api/login";
import { isHttp } from "@/utils/validate";
import { isRelogin } from "@/utils/request";
import { getRouters } from "@/api/menu";
import useUserStore from "@/store/modules/user";
import useSettingsStore from "@/store/modules/settings";
import usePermissionStore from "@/store/modules/permission";

NProgress.configure({ showSpinner: false });

// 路由白名单，不需要登录就能访问
const whiteList = ["/login", "/auth-redirect", "/bind", "/register"];
// 路由前置守卫
router.beforeEach(async (to, from, next) => {
  NProgress.start();
  // 若地址带有登录票据，则通过票据获取token
  if (to.query.cssSsoTicket) {
    const cssSsoTicket = to.query.cssSsoTicket;
    await getloginToken(cssSsoTicket).then((res) => {
      console.log(res.token);
      if (res.code == 200) {
        setToken(res.token);
        setUserId(res.userId);
      }
    });
  }
  // 判断有token则获取用户信息
  if (getToken()) {
    to.meta.title && useSettingsStore().setTitle(to.meta.title);
    /* has token*/
    if (to.path === "/login") {
      next({ path: "/" });
      NProgress.done();
    } else {
      if (useUserStore().roles.length === 0) {
        isRelogin.show = true;
        // 判断当前用户是否已拉取完user_info信息
        await useUserStore()
          .getInfo(getUserId())
          .then(async () => {
            isRelogin.show = false;
            await usePermissionStore()
              .generateRoutes(getUserId())
              .then((accessRoutes) => {
                // // 根据roles权限生成可访问的路由表
                // accessRoutes.forEach((route) => {
                //   if (!isHttp(route.path)) {
                //     router.addRoute(route); // 动态添加可访问路由表
                //   }
                // });
                // hack方法 确保addRoutes已完成
                next({ ...to, replace: true });
              });
          })
          .catch((err) => {
            // 校验登录状态，若未登录则跳转登录页
            // checkLoginStatus();
            // 退出登录
            loginOut();
          });
      } else {
        next();
      }
    }
  } else {
    // 没有token
    if (whiteList.indexOf(to.path) !== -1) {
      // 在免登录白名单，直接进入
      next();
    } else {
      // 校验登录状态，若未登录则跳转登录页
      checkLoginStatus();
      // next(`/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页
      NProgress.done();
    }
  }
});

// 路由后置守卫
router.afterEach(() => {
  NProgress.done();
});

// 校验登录状态，若未登录则跳转登录页
function checkLoginStatus() {
  const env = import.meta.env.VITE_APP_ENV;
  // 开发环境前端校验登录状态，其它环境通过后端校验登录状态
  if(env == "development") {
    // 跳转单点登录页并检测是否登录
    location.href = import.meta.env.VITE_APP_SSO_SERVE + '/sso/quit.action?toUrl=' + location.href;
  } else {
    // 跳转登录页面，通过后端校验实现跳转
    location.href = import.meta.env.VITE_APP_API_SERVE + import.meta.env.VITE_APP_BASE_API;
  }
}

// 退出登录
function loginOut() {
  useUserStore().logOut().then((res) => {
    ElMessage.error(err);
    console.log(res);
    location.href = res.retUrl;
  })
}